# pmg_attendance_ui.py
# 要运行此应用，请确保已安装必要的库

from datetime import datetime
from nicegui import ui, app
import os
import io
import pandas as pd
from pathlib import Path
# 获取项目根目录
project_root = Path(__file__).resolve().parent.parent.parent
# 导入自定义模块
from pages.pmg_attendance.pmg_report import process_pmg_report
from theme import frame

class PMGAttendancePage:
    def __init__(self):
        self.status_output = []
        self.excel_path = os.path.join(project_root, 'img', 'pmg.xlsx')
        self.uploaded_file = None
    
    def upload_file(self, file):
        """处理上传的Excel文件"""
        if not file.name.endswith('.xlsx'):
            ui.notify('请上传Excel文件(.xlsx格式)', type='negative')
            return
        
        try:
            # 确保目录存在
            os.makedirs(os.path.dirname(self.excel_path), exist_ok=True)
            # 保存上传的文件到img目录，替换pmg.xlsx
            with open(self.excel_path, 'wb') as f:
                f.write(file.content.read())
            ui.notify(f'文件 {file.name} 上传成功并已替换pmg.xlsx', type='positive')
            self.uploaded_file = file.name
        except Exception as e:
            ui.notify(f'文件上传失败: {str(e)}', type='negative')
            print(f'文件上传失败: {e}', exc_info=True)  # 增加详细错误信息
    
    async def perform_analysis(self, start_date_input, end_date_input):
        """执行考勤分析"""
        self.status_output.clear()
        start_date_str = start_date_input.value
        end_date_str = end_date_input.value

        if not all([start_date_str, end_date_str]):
            ui.notify('所有字段均为必填项。', type='negative')
            self.status_output.append('错误：所有字段均为必填项。')
            # 直接调用update_status函数
            self.update_status()
            return

        try:
            start_date_dt = datetime.strptime(start_date_str, '%Y-%m-%d')
            end_date_dt = datetime.strptime(end_date_str, '%Y-%m-%d')
            if end_date_dt < start_date_dt:
                ui.notify('结束日期不能早于开始日期。', type='negative')
                self.status_output.append('错误：结束日期不能早于开始日期。')
                return
        except ValueError:
            ui.notify('日期格式错误，请使用 YYYY-MM-DD 格式。', type='negative')
            self.status_output.append('错误：日期格式错误。')
            return

        self.status_output.append('正在处理PMG考勤报表...')
        ui.notify('正在处理PMG考勤报表...', type='info')

        try:
            # 调用pmg_report.py中的process_pmg_report函数
            process_pmg_report(start_date_str, end_date_str)
            self.status_output.append(f'报表处理完成，已保存到: {self.excel_path}')
            ui.notify('PMG考勤报表处理完成', type='positive')
        except Exception as e:
            self.status_output.append(f'处理过程中发生错误: {e}')
            ui.notify(f'处理过程中发生错误: {str(e)}', type='negative')
            print(f'处理过程中发生错误: {e}')
    
    def download_file(self):
        """下载处理后的Excel文件"""
        try:
            if os.path.exists(self.excel_path):
                with open(self.excel_path, 'rb') as f:
                    file_content = f.read()
                ui.download(file_content, 'pmg.xlsx')
                ui.notify('Excel文件下载已启动', type='positive')
            else:
                ui.notify('文件不存在，请先执行分析', type='negative')
        except Exception as e:
            ui.notify(f'下载失败: {str(e)}', type='negative')
            print(f'下载失败: {e}')
    
    def entry_page_content(self):
        """页面内容"""
        # 第一行：文件上传
        with ui.card().classes('w-full'):
            with ui.row().classes('p-4 items-center'):
                ui.label('上传驻点人员Excel文件').classes('text-bold')
                ui.upload(on_upload=self.upload_file, multiple=False,auto_upload=True).props('accept=.xlsx')
                if self.uploaded_file:
                    ui.label(f'已上传: {self.uploaded_file}')
            ui.separator()
            
            # 第二行：查询日期和按钮
            with ui.row().classes('p-4 items-center'):
                ui.label('查询日期范围').classes('text-bold')
                ui.label('开始日期')
                start_date_input = ui.input(
                    value=datetime.now().strftime('%Y-%m-%d')
                ).props('type=date')
                ui.label('结束日期')
                end_date_input = ui.input(
                    value=datetime.now().strftime('%Y-%m-%d')
                ).props('type=date')

                ui.button(
                    '开始分析',
                    on_click=lambda: self.perform_analysis(
                        start_date_input,
                        end_date_input
                    ),
                ).classes('mt-4').props('color=primary')
                ui.button('下载Excel', on_click=self.download_file).classes(
                    'mt-4 ml-2').props('color=primary')

        # 第三行：状态输出
        with ui.card().classes('w-full mt-4'):
            ui.label('处理状态').classes('text-bold')
            status_area = ui.markdown().classes('w-full h-40 overflow-y-auto bg-gray-50 p-4')
            
            # 更新状态显示的函数
            def update_status():
                status_area.content = '\n'.join(self.status_output)
            
            # 移除将函数存储到app.storage.user的代码
            # app.storage.user['status_update'] = update_status
            
            # 初始状态
            update_status()

def entry_page():
    with frame('PMG考勤分析'):
        ui.page_title('PMG考勤分析')
        ep = PMGAttendancePage()
        ep.entry_page_content()

